package org.talend;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import javax.xml.rpc.ServiceException;

/**
 * Permet d'interroger un Job Talend expose en WebService
 * 
 * @author C.SONNEFRAUD
 *
 */
public class TalendJobWSCaller implements TalendJobWS {
	
	private String portName;
	private String address;
	
	public TalendJobWSCaller(String address) {
		super();
		this.address = address;
		// Par convention de nommage, le nom du port est toujours a la fin de l'URL
		this.portName = this.address.substring((this.address.lastIndexOf("/")+1));
	}

	/**
	 * Implementation de l'operation runJob issue du WSDL2JAVA. 
	 * Utilisé ici de maniere technique, dans la methode execute(String... args)
	 * 
	 */
	public String[][] runJob(String[] args) throws RemoteException {
		
		String[][] output = null;
		
		try {
			
			TalendJobWSService ws;
			TalendJobWSServiceLocator wsl = new TalendJobWSServiceLocator();
			wsl.setEndpointAddress(this.portName, this.address);
		
			ws = wsl;
			TalendJobWS port = ws.getTalendJobWS();
			
			output = port.runJob(args);

			return output; 
			
		} catch (ServiceException e) {
			e.printStackTrace();
			
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return output;	
		
	}
	
	/**
	 * Permet d'executer un Job Talend expose en WebService
	 * et de recuperer les donnees sous forme d'une Liste de listes
	 * 
	 * @param args La liste des arguments (--context_param var=val)
	 * @return Une liste de listes renvoyant le resultat de l'execution du job
	 */
	public List<List<String>> executeAndGetList(String... args) {
		
		String[][] output = null;
		List<List<String>> outputMatrix = new ArrayList<List<String>>();
		
		try {
			output = this.runJob(args);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		
		for (String[] row : output) {
			ArrayList<String> currentRow = new ArrayList<String>();
			for (String val : row){
				currentRow.add(val);
			}
			outputMatrix.add(currentRow);
		}
				
		return outputMatrix;
	}
	
	/**
	 * Exception pour gerer le cas ou l'on souhaite alimenter des Maps
	 *
	 */
	private class IncorrectTalendJobSchemaException extends Exception{
	       
		private static final long serialVersionUID = -2754509625737029858L;

		public String toString(){
          String str = super.toString();
          return new String(str + " : Talend Job schema is incorrect !");   
          }
	}	  
	
	/**
	 * Permet d'executer un Job Talend expose en WebService
	 * et de recuperer les donnees sous forme d'une Map
	 * Le schema du job doit envoyer des couples (cle,valeur)
	 * 
	 * @param args La liste des arguments (--context_param var=val)
	 * @return Une map renvoyant le resultat de l'execution du job
	 */
	public Map<String, String> executeAndGetMap(String... args) throws IncorrectTalendJobSchemaException {
		
		String[][] output = null;
		Map<String, String> outputMatrix = new HashMap<String, String>();
		
		try {
			{
			output = this.runJob(args);
			}
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		
		for (String[] row : output) {
			for (int i=0;i<row.length;i++){
				if (row.length == 2){
					outputMatrix.put(row[0], row[1]);
				} else {
					throw new IncorrectTalendJobSchemaException();
				} 
			}
		}
				
		return outputMatrix;
	}

	public static void main(String[] args) {
		
//		TalendJobWSCaller ws = new TalendJobWSCaller("http://bcnssap024:8180/TalendJobWS_0.1/services/TalendJobWS");
// 		System.out.println(ws.executeAndGetList("--context_param var=酒 - ♘ - ☂ - ☢ - ě - ű"));
// 		System.out.println(ws.executeAndGetList("--context_param var=T&D"));
// 		try {
//			System.out.println(ws.executeAndGetMap(new String[0]));
//		} catch (IncorrectTalendJobSchemaException e) {
//			e.printStackTrace();
//		}

		
		Map <String,String> myMap = new HashMap<String, String>();
		
		TalendJobWSCaller ws = new TalendJobWSCaller("http://bcnssap024:8180/WF_GetListeUniteOperationnelle_0.1/services/WF_GetListeUniteOperationnelle");
		try {
			 myMap = ws.executeAndGetMap("--context_param dataModel=EDIFICE","--context_param dataContainer=EDIFICE");
		} catch (IncorrectTalendJobSchemaException e) {
			e.printStackTrace();
		}
		
		System.out.println(myMap);
		
		Map <String,String> reversedMap = new HashMap<String, String>();
		for(Map.Entry<String,String> myEntry : myMap.entrySet()){
			reversedMap.put(myEntry.getValue(), myEntry.getKey());
		}
		
		System.out.println(reversedMap);
		
//		TalendJobWSCaller ws1 = new TalendJobWSCaller("http://bcnssap024:8180/WF_GetListeDevise_0.1/services/WF_GetListeDevise");
//		System.out.println(ws1.executeAndGetList());
		
	}
}
